\chapter{Génération de pcod}

\section{Transformation en pcod}

Le principe du générateur est de parcourir lexicalement le fichier pascal .p et de le traduire en pcod.
Voici quelques exemples de passage de pascal vers le pcod. La liste complète des instructions pcod est disponible dans le chapitre 6 interpréteur.
\newline
\newline
\begin{tabular}{|l|l|l|}
  \hline
  Pascal & Pcod & Commentaire \\
  \hline
  integ = 2; & LIT 1,2 & \\
  pi = 3.14; & LIT 2,3.14 & \\
  bool = true; & LIT 3,1 & Création d'une constante \\
  ch = 'i'; & LIT 4,'i' & \\
  s = "string"; & LIT 5,"string" & \\
  \hline
  i : integer; & INC 1,1 & \\
  r : real; & INC 2,1 & \\
  b : boolean; & INC 3,1 & Création d'une variable \\
  ch : char; & INC 4,1 & \\
  s : string; & INC 5,1 & \\
  \hline
  procedure MaProc; & NOP 0,0 & Début de la procedure \\
    begin & LIT 1,0 & Ajoute int 0 \\
      i := - 5 - ( 7 - 9 ); & LIT 1,5 & Ajoute int 5 \\
    end; & OPR 0,1 & 0 - 5 = -5 \\
  & LIT 1,7 & Ajoute int 7 \\
  & LIT 1,9 & Ajoute int 9 \\
  & OPR 0,1 & 7 - 9 = -2 \\
  & OPR 0,1 & -5 - (-2) = -3 \\
  & STO 1,index var i & i = -3 \\
  & RET 0,0 & Retour de la procédure \\
  \hline
\end{tabular}

\begin{tabular}{|l|l|l|}
  \hline
  write ( "test" ); & LIT 4,"test" & Ajoute string "test" \\
  & WRT 0,0 & Ecrire "test" \\
  \hline
  read ( b ) ; & REA 3,0 & Ajoute variable booléen \\
  & STO 3,index var b & Rangement du booléen dans b \\
  \hline
  MaProc; & CAL 0,index procedure & Appel de la procedure MaProc \\
  \hline
  if 7 > 3 then & LIT 1,7 & Ajoute int 7 \\
  & LIT 1,3 & Ajoute int 3 \\
  & OPR 0,6 & Test si 7 > 3 \\
  & SFL 0,0 & Met le flag à true \\
  \hline
\end{tabular}

\section{Table des procédures}

A chaque déclaration de procédure dans le programme Pascal, la table des procédures fait l'association entre le nom de la procédure et la ligne de pcod correspondant au début des instruction pcod de la procédure (instruction NOP).

\section{Table des symboles}

La table des symboles est stockée à la fin du fichier pcod et contient :
\begin{itemize}
  \item Le nom des variables
  \item Le type des variables
\end{itemize}
Elle se présente sous cette forme :
\begin{verbatim}
%% nom type
%% pi c_double
%% integ c_int
%% s c_string
%% ch c_char
%% bool c_bool
\end{verbatim}
Le principe est d'ajouter une ligne dans la table lorsqu'une variable est déclarée.
Cette table est utilisée pour afficher un retour vers l'interface TCL.
Grâce à elle et la pile d'exécution, on peut afficher le nom de la variable et sa valeur.
Le nom est stockée dans la table, la valeur dans la pile. Pour les faire coïncider, le rang d'une variable de la table correspond au rang dans la pile d'exécution.